#include "Cliente.h"
#include <cstdlib>
#include "red_socketcliente.h"
#include "FabricaDeTerritorios.h"
#include "Mapa.h"
#include "MapaParser.h"

Cliente::Cliente()
{
}

//TODO::Arrojar excepciones.
void Cliente::conectar(string host, string puerto) {
	this->m_pSocket = new SocketCliente(host.data(),atoi(puerto.data());
	if (!m_pSocket) {
	} 
	else if (!m_pSocket->getUtilizable()) {
		delete m_pSocket;
	} 
	else {
		//TODO::/** SOLO PARA PRUEBA. ESTO NO VA A IR ACA*/
		FabricaDeTerritorios fabricaDeTerritorios;
		Mapa unMapa(&fabricaDeTerritorios);
		MapaParser mapaParser(&unMapa);
		mapaParser.parse_file("mapa.xml");
		m_pHiloDeEntrada = new HiloDeEntrada(m_pSocket, new JuegoClientImp(2,unMapa));
		m_pHiloDeEntrada->start();
	}
}

//TODO::Arrojar excepciones.
void Cliente::conectar(string host, string puerto) {
	this->m_pSocket = new SocketCliente(host.data(),atoi(puerto.data());
	if (!t_pSocket) {
		} else if (!t_pSocket->getUtilizable()) {
			delete t_pSocket;
		} else {
			this->conectado = true;
			//TODO::REMOVE THIS t_pJuego = new Juego(t_pSocket);
			t_pHiloDeEntrada = new HiloDeEntrada(t_pSocket, *t_pJuego);
			t_pHiloDeEntrada->start();
		}
}

bool Cliente::isConectado() {
	bool valor;
	this->m_Mutex.lock();
	valor = this->conectado;
	this->m_Mutex.unlock();
	return valor;
}

bool Cliente::isBajandoImagen() {
	bool valor;
	this->m_Mutex.lock();
	valor = this->descargandoImagen;
	this->m_Mutex.unlock();
	return valor;
}

void Cliente::setBajandoImagen(bool valor) {
	this->m_Mutex.lock();
	this->descargandoImagen = valor;
	this->m_Mutex.unlock();
	this->notifyAll();
}

void Cliente::setProgresoDescarga(int valor) {
	this->m_Mutex.lock();
	this->progresoDescarga = valor;
	this->m_Mutex.unlock();
	this->notifyAll();
}

int Cliente::getProgresoDescarga(){
	this->m_Mutex.lock();
	this->progresoDescarga = valor;
	this->m_Mutex.unlock();
}

void Cliente::unirseAlJuego(string nombreJugador, string colorJugador) {
	string mensaje = "<jugada>\n";
	mensaje += "	<unirse nombre=\""+nombreJugador+"\" color=\""+colorJugador+"\"/>\n";
	mensaje += "</jugada>";
	this->enviarMensaje(mensaje);
}

void Cliente::enviarMensaje(string mensaje) {
	//TODO::ELMININAR MENSAJES DE SALIDA EN PROTOCOLO. O CREAR UN MENSAJE DE SALIDA ACA.
	Protocolo t_Protocolo(this->m_pSocket);
	t_Protocolo.bEnviarMensaje(p_pMsgSal);
}

void Cliente::addObserver(Observer* observer) {
	this->observadores->push_back(observer);
}

void setConfiguracionesDelJuego(Configuraciones* configuraciones) {
	this->configuraciones = configuraciones;
	this->notifyAll();
}
Configuraciones* getConfiguracionesDelJuego() {
	Configuraciones* valor;
	this->m_Mutex.lock();
	valor = this->configuraciones;
	this->m_Mutex.unlock();
	return valor;
}


void Cliente::enviarMensaje(string mensaje) {
	Protocolo protocolo(this->m_pSocket);
	protocolo.enviarPaquete(mensaje);
}

Cliente::~Cliente()
{
}
